home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / gnu / glibc108.gz / glibc108 / glibc-1.08.1 / sysdeps / sparc / submul_1.S < prev    next >
Text File  |  1994-04-26  |  3KB  |  147 lines

  1. ! SPARC __mpn_submul_1 -- Multiply a limb vector with a limb and subtract
  2. ! the result from a second limb vector.
  3.  
  4. ! Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
  5.  
  6. ! This file is part of the GNU MP Library.
  7.  
  8. ! The GNU MP Library is free software; you can redistribute it and/or modify
  9. ! it under the terms of the GNU Library General Public License as published by
  10. ! the Free Software Foundation; either version 2 of the License, or (at your
  11. ! option) any later version.
  12.  
  13. ! The GNU MP Library is distributed in the hope that it will be useful, but
  14. ! WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  15. ! or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
  16. ! License for more details.
  17.  
  18. ! You should have received a copy of the GNU Library General Public License
  19. ! along with the GNU MP Library; see the file COPYING.LIB.  If not, write to
  20. ! the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21.  
  22.  
  23. ! INPUT PARAMETERS
  24. ! res_ptr    o0
  25. ! s1_ptr    o1
  26. ! size        o2
  27. ! s2_limb    o3
  28.  
  29. #include "sysdep.h"
  30.  
  31. .text
  32.     .align 4
  33.     .global    C_SYMBOL_NAME(__mpn_submul_1)
  34. C_SYMBOL_NAME(__mpn_submul_1):
  35.     ! Make S1_PTR and RES_PTR point at the end of their blocks
  36.     ! and put (- 4 x SIZE) in index/loop counter.
  37.     sll    %o2,2,%o2
  38.     add    %o0,%o2,%o4    ! RES_PTR in o4 since o0 is retval
  39.     add    %o1,%o2,%o1
  40.     sub    %g0,%o2,%o2
  41.  
  42.     cmp    %o3,0xfff
  43.     bgu    Large
  44.     nop
  45.  
  46.     ld    [%o1+%o2],%o5
  47.     mov    0,%o0
  48.     b    L0
  49.      add    %o4,-4,%o4
  50. Loop0:
  51.     subcc    %o5,%g1,%g1
  52.     ld    [%o1+%o2],%o5
  53.     addx    %o0,%g0,%o0
  54.     st    %g1,[%o4+%o2]
  55. L0:    wr    %g0,%o3,%y
  56.     sra    %o5,31,%g2
  57.     and    %o3,%g2,%g2
  58.     andcc    %g1,0,%g1
  59.     mulscc    %g1,%o5,%g1
  60.      mulscc    %g1,%o5,%g1
  61.      mulscc    %g1,%o5,%g1
  62.      mulscc    %g1,%o5,%g1
  63.     mulscc    %g1,%o5,%g1
  64.     mulscc    %g1,%o5,%g1
  65.     mulscc    %g1,%o5,%g1
  66.     mulscc    %g1,%o5,%g1
  67.     mulscc    %g1,%o5,%g1
  68.     mulscc    %g1,%o5,%g1
  69.     mulscc    %g1,%o5,%g1
  70.     mulscc    %g1,%o5,%g1
  71.     mulscc    %g1,0,%g1
  72.     sra    %g1,20,%g4
  73.     sll    %g1,12,%g1
  74.      rd    %y,%g3
  75.     srl    %g3,20,%g3
  76.     or    %g1,%g3,%g1
  77.  
  78.     addcc    %g1,%o0,%g1
  79.     addx    %g2,%g4,%o0    ! add sign-compensation and cy to hi limb
  80.     addcc    %o2,4,%o2    ! loop counter
  81.     bne    Loop0
  82.      ld    [%o4+%o2],%o5
  83.  
  84.     subcc    %o5,%g1,%g1
  85.     addx    %o0,%g0,%o0
  86.     retl
  87.     st    %g1,[%o4+%o2]
  88.  
  89.  
  90. Large:    ld    [%o1+%o2],%o5
  91.     mov    0,%o0
  92.     sra    %o3,31,%g4    ! g4 = mask of ones iff S2_LIMB < 0
  93.     b    L1
  94.      add    %o4,-4,%o4
  95. Loop:
  96.     subcc    %o5,%g3,%g3
  97.     ld    [%o1+%o2],%o5
  98.     addx    %o0,%g0,%o0
  99.     st    %g3,[%o4+%o2]
  100. L1:    wr    %g0,%o5,%y
  101.     and    %o5,%g4,%g2
  102.     andcc    %g0,%g0,%g1
  103.     mulscc    %g1,%o3,%g1
  104.     mulscc    %g1,%o3,%g1
  105.     mulscc    %g1,%o3,%g1
  106.     mulscc    %g1,%o3,%g1
  107.     mulscc    %g1,%o3,%g1
  108.     mulscc    %g1,%o3,%g1
  109.     mulscc    %g1,%o3,%g1
  110.     mulscc    %g1,%o3,%g1
  111.     mulscc    %g1,%o3,%g1
  112.     mulscc    %g1,%o3,%g1
  113.     mulscc    %g1,%o3,%g1
  114.     mulscc    %g1,%o3,%g1
  115.     mulscc    %g1,%o3,%g1
  116.     mulscc    %g1,%o3,%g1
  117.     mulscc    %g1,%o3,%g1
  118.     mulscc    %g1,%o3,%g1
  119.     mulscc    %g1,%o3,%g1
  120.     mulscc    %g1,%o3,%g1
  121.     mulscc    %g1,%o3,%g1
  122.     mulscc    %g1,%o3,%g1
  123.     mulscc    %g1,%o3,%g1
  124.     mulscc    %g1,%o3,%g1
  125.     mulscc    %g1,%o3,%g1
  126.     mulscc    %g1,%o3,%g1
  127.     mulscc    %g1,%o3,%g1
  128.     mulscc    %g1,%o3,%g1
  129.     mulscc    %g1,%o3,%g1
  130.     mulscc    %g1,%o3,%g1
  131.     mulscc    %g1,%o3,%g1
  132.     mulscc    %g1,%o3,%g1
  133.     mulscc    %g1,%o3,%g1
  134.     mulscc    %g1,%o3,%g1
  135.     mulscc    %g1,%g0,%g1
  136.     rd    %y,%g3
  137.     addcc    %g3,%o0,%g3
  138.     addx    %g2,%g1,%o0
  139.     addcc    %o2,4,%o2
  140.     bne    Loop
  141.      ld    [%o4+%o2],%o5
  142.  
  143.     subcc    %o5,%g3,%g3
  144.     addx    %o0,%g0,%o0
  145.     retl
  146.     st    %g3,[%o4+%o2]
  147.